#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
//实现任何文件的重定向
int main(int argc,char* argv[])
{
	//#include<unistd.h>  int dup2(int oldfd,int newfd);
	//作用:将newfd变为oldfd
	//若成功就返回新的文件描述符，反之就返回-1
	//输入重定向
	int fd=open(argv[1],O_RDONLY);
	int ret=dup2(fd,0);
	if(ret<0)
	{
		exit(1);
	}
	close(fd);
	while(1)
	{
		char buffer[64];
		int arr=0;
		if(!(arr=read(0,buffer,sizeof(buffer)-1)))
		{
			break;
		}
		else
		{
			buffer[arr]=0;
			printf("%s",buffer);
		}
	}
	return 0;
}
//int main()
//{
//	//#include<unistd.h>  int dup2(int oldfd,int newfd);
//	//作用:将newfd变为oldfd
//	//若成功就返回新的文件描述符，反之就返回-1
//	//输入重定向
//	int fd=open("log.txt",O_RDONLY);
//	int ret=dup2(fd,0);
//	if(ret<0)
//	{
//		exit(1);
//	}
//	close(fd);
//	while(1)
//	{
//		char buffer[64];
//		int arr=0;
//		if(!(arr=read(0,buffer,sizeof(buffer)-1)))
//		{
//			break;
//		}
//		else
//		{
//			buffer[arr]=0;
//			printf("%s",buffer);
//		}
//	}
//	return 0;
//}
//int main()
//{
//	//现象:关闭stdout文件，再使用printf进行打印，发现内容写入了log.txt--->重定向
//	close(1);
//	int fd=open("log.txt",O_WRONLY|O_APPEND);
//	printf("hhhhhh");
//	return 0;
//}
//int main()
//{
//	int fd=open("log.txt",O_RDONLY);
//	while(1)
//	{
//		char buffer[64];//不初始化的时候里面是随机值  没有\0
//	//#include<unistd.h> ssize_t read(int fd,void* buf,size_t count)
//		int arr = 0;
//		if(!(arr = read(fd,buffer,sizeof(buffer)-1)))
//		{
//			break;
//		}
//		else
//		{
//			buffer[arr]=0;
//			printf("%s",buffer);
//		}
//	}
//	return 0;
//}
//int main()
//{
//	int fd=open("log.txt",O_RDONLY);
//	while(1)
//	{
//		char buffer[64];//不初始化的时候里面是随机值  没有\0
//	//#include<unistd.h> ssize_t read(int fd,void* buf,size_t count)
//		int arr = 0;
//		if(!(arr = read(fd,buffer,sizeof(buffer))))
//		{
//
//			break;
//		}
//		else
//		{
//			printf("%s\n\n",buffer);
//		}
//	}
//	return 0;
//}
//int main()
//{
//	//#include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>
//	//int open(const char* pathname,int flags,mode_t mode);
//	//该函数用于打开文件，打开成功就返回新的文件描述符fd，失败则返回-1，其中mode则代表着权限位
//	//int fd=open("log.txt",O_CREAT|O_WRONLY,0666);//如果打开一个不存在的文件，则需要加上权限位
//	//flag的参数有O_CREAT,O_WRONLY,O_RDONLY,O_APPEND,O_TRUNC,O_RDWR
//	
//	//int fd=open("log.txt",O_WRONLY|O_TRUNC);//该flag组合表示清空并写入
//	int fd=open("log.txt",O_WRONLY|O_APPEND);//该flag组合表示追加并写入
//	const char* buffer="hello world\n";
//	//#include <unistd.h> ssize_t write(int fd,const void* buf,size count);//用于向指定文件中写入
//	int cnt=5;
//	printf("%d\n",strlen(buffer));
//	while(cnt--)
//	{
//		write(fd,buffer,strlen(buffer));
//	}
//
//	//#include<unistd.h> int close(int fd);  关闭一个文件
//	close(fd);
//	return 0;
//}


